Libraries laden
library(tidyverse)
library(readr)
library(broom)
library(gridExtra)
library(stats)
library(janitor)
library(skimr)
library(lubridate)
getwd()
[1] "C:/DHBW/Semester3/DataScience/Weiner_inf24_Passanten"
zuerst importiert man die Daten und zeigt Sie an um zu überprüfen ob der import funktioniert hat.
passanten_raw <- read_csv2("Datensatz/passanten_wuerzburg.csv")
passanten <- as_tibble(passanten_raw)
passanten
Nun besitzt man die Daten als Dataframe. Um mit ihnen sinvolle, descriptive oder weiterführend eine Explorative Datenanalyse durchzuführen sollten die Daten zuerst bereinigt werden. Als nächstes prüfen wir ob die Spalentnamen Aussagekräfig sind und ändern sie ab falls notwendig
names(passanten)
[1] "Zeitstempel" "Wetter" "Temperatur" "Passanten" "Location Name"
[6] "GeoPunkt" "Passanten ltr" "Passanten rtl" "Passanten Erwachsene" "Passanten Kinder"
[11] "Passanten Erwachsene ltr" "Passanten Erwachsene rtl" "Passanten Kinder ltr" "Passanten Kinder rtl"
#Formatieren Spalten Namen
passanten <- clean_names(passanten)
passanten
Somit können wir nun leer Spalten entfernen und nachsehen wie vollständig die Daten sind.
#Aufzählung der NA nach Spalte
colSums(is.na(passanten))
zeitstempel wetter temperatur passanten location_name geo_punkt
0 112 112 0 0 0
passanten_ltr passanten_rtl passanten_erwachsene passanten_kinder passanten_erwachsene_ltr passanten_erwachsene_rtl
11395 11395 11395 11395 11395 11395
passanten_kinder_ltr passanten_kinder_rtl
11395 11395
nrow(passanten)
[1] 26018
#Entfernen leere Spalten
passanten <- janitor::remove_empty(passanten)
nrow(passanten)
[1] 26018
#Die Gehrichtung und erkennung der erwachsenen / kinder fehlt bei 11395 Zeilen. Unvollständige daten bis dahin.Kein komplett leere spalte gefunden. Anschließend Prüfen wir die Datentypen und Einheiten die die Spalten haben.
passanten <- passanten %>%
mutate(
temperatur = as.numeric(temperatur),
passanten = as.numeric(passanten),
zeitstempel = as.Date(zeitstempel)
)
Zum Schluss erhalten wir eine übersicht über die Daten
summary(passanten)
zeitstempel wetter temperatur passanten location_name geo_punkt passanten_ltr passanten_rtl
Min. :2023-12-31 Length:26018 Min. :-11.00 Min. : 0.0 Length:26018 Length:26018 Min. : 0.0 Min. : 0.0
1st Qu.:2024-03-31 Class :character 1st Qu.: 5.50 1st Qu.: 53.0 Class :character Class :character 1st Qu.: 24.0 1st Qu.: 27.0
Median :2024-06-30 Mode :character Median : 10.70 Median : 467.0 Mode :character Mode :character Median : 233.0 Median : 263.0
Mean :2024-07-01 Mean : 11.26 Mean : 840.5 Mean : 438.4 Mean : 454.4
3rd Qu.:2024-10-01 3rd Qu.: 17.00 3rd Qu.:1341.0 3rd Qu.: 676.0 3rd Qu.: 750.0
Max. :2024-12-31 Max. : 34.00 Max. :8075.0 Max. :4461.0 Max. :3614.0
NA's :112 NA's :11395 NA's :11395
passanten_erwachsene passanten_kinder passanten_erwachsene_ltr passanten_erwachsene_rtl passanten_kinder_ltr passanten_kinder_rtl
Min. : 0.0 Min. : 0.00 Min. : 0.0 Min. : 0.0 Min. : 0.00 Min. : 0.000
1st Qu.: 51.0 1st Qu.: 1.00 1st Qu.: 24.0 1st Qu.: 26.0 1st Qu.: 0.00 1st Qu.: 0.000
Median : 499.0 Median : 7.00 Median : 229.0 Median : 258.0 Median : 3.00 Median : 4.000
Mean : 877.5 Mean : 15.31 Mean : 431.2 Mean : 446.3 Mean : 7.24 Mean : 8.075
3rd Qu.:1392.5 3rd Qu.: 26.00 3rd Qu.: 661.0 3rd Qu.: 734.0 3rd Qu.: 12.00 3rd Qu.:14.000
Max. :7933.0 Max. :179.00 Max. :4375.0 Max. :3558.0 Max. :118.00 Max. :77.000
NA's :11395 NA's :11395 NA's :11395 NA's :11395 NA's :11395 NA's :11395
skimr::skim(passanten)
── Data Summary ────────────────────────
Values
Name passanten
Number of rows 26018
Number of columns 14
_______________________
Column type frequency:
character 3
Date 1
numeric 10
________________________
Group variables None
Der Datensatz besteht aus 26018 Zeile und 14 Spalten.Die in den Spalten aufgezeichneten werte sind:
head(passanten)
Die interessantest Variable ist hierbei die anzahl der Passanten. Dabei werden hir die anzahl der Passanten mit jewails eine Zeitstempel und weiteren Metadaten wie: Temperatur, Ort der Aufzeichnung und Koordinaten des Ortes Zeilenweise angegeben. Die Zeitstempel sind dabei Stündlich für jede der drei Messtationen angegeben.
table(passanten$location_name)
Kaiserstraße Schönbornstraße Spiegelstraße
8695 8649 8674
Somit kann man davon ausgehen das die anzahl der Passanten der anzahl der Passanten entspricht die inerhalb einer Stunde durch die Messtation erfasst wurden. Die Metadaten dienen dann zur Interpretation der Hauptdaten.
Die Daten stamen von zählstationen an verschiedenen Punken aus der Nürnberger Innenstadt. Mit hilfe von Laserschranken zählen diese die Anzahl der Passanten welche gerade die Messtation Queren. Durch das Messen mit meheren Laserschranken pro Messtation kann auch die Geh-Richtung des Passanten bestimmt werden. Zur konsistenz der Daten wird vermerkt: “Nach Herstellerangabe kann mit der verwendeten Technik bis zu einem Durchfluss von ca. 500 Personen pro Minute eine Zählgenauigkeit von 99% erreicht werden.” vgl. Methodik_hystreet.com. Dabei ist zu beachten, dass eine Zählstation eine Straße bis Maximal 32m Breite abdecken kann. Die Erheber der daten versichern jedoch, dass “Bei den veröffentlichten Daten handelt es sich immer um die Passantenfrequenz der gesamten Straßenbreite (außer es ist explizit anders angegeben).”
table(passanten$geo_punkt)
49.79512717222457, 9.934114106308467 49.795490162266525, 9.931060093195851 49.798498976405355, 9.933887635731686
8674 8649 8695
table(passanten$location_name)
Kaiserstraße Schönbornstraße Spiegelstraße
8695 8649 8674
Der Datenstatz enthält Koordinaten in der Spalte geo_punkt und die orte der Messtationen in der Spalte location_name. Wenn man sich anschaut wie of eine einzelner Standort vorkommt sieht man, dass es jewail 3 Einzelne Standorte gibt und dazu passend die 3 Standorte in Koordinatenform. Die Summen (Wie oft ein Einzelner eintrag vorkommt) ist ebenfalls gleich. Somit ist eine eindeutige zuordung der Standorte zu den Koordinaten möglich. Gleichzeit können wir sicher sein das keine Falschen Standorte oder Koordinaten vorliegen und das jeder Standort auch mit den Korrekten Korrdinaten versehen sind.Wenn man nun die Koordinaten auf einer Karte anzeigen Lässt erhält man folgendes Bild.
Man kann sehen, das die Stationen direkt in der Innenstad stationiert sind. Dabei ist jede Station in der Nähe einer Sehenswürdigkeit bzw. Öffentlichen Gebäude. Die Messtation Schönbornstraße befindet sich nah an der Marienkapelle, die Messtation Spiegelstraße auf dem weg zum Hofgarten und die Messtation Kaiserstraße in der nähe zum Hauptbahnhof. Dabei sind alle diese Straßen Hauptverkehrsstraßen auf welchen man mit gleichmäsiger auslastung rechnen kann. Das Dreiecksmuster welche die Stationen Aufspannen bilden somit eine Art Transitstrecke zwischen: Hauptbahnhof -> Hofgarten -> Marienkapelle -> Hauptbahnhof.
# --- 1. Analyse gegliedert nach Messstellen ---
# (Wie in deinem Code-Ansatz begonnen)
# Wir gruppieren nach dem Standortnamen
passanten_pro_location <- passanten %>%
group_by(location_name) %>%
summarise(
# 1. Jahressumme pro Standort
# Wir summieren alle Werte in der 'passanten'-Spalte für die jeweilige Gruppe
passanten_jahr_summe = sum(passanten, na.rm = TRUE),
# Hilfsberechnung: Anzahl der einzigartigen Tage, an denen Daten erfasst wurden
# as.Date() wandelt den Zeitstempel in ein reines Datum um
# n_distinct() zählt, wie viele einzigartige Tage es gibt
anzahl_tage_erfasst = n_distinct(as.Date(zeitstempel)),
# 2. Mittelwert pro Monat
# Wir nehmen die Jahressumme und teilen sie durch 12 Monate
durchschnitt_pro_monat = passanten_jahr_summe / 12,
# 3. Mittelwert pro Woche
# Wir teilen die Jahressumme durch die Anzahl der Wochen im Jahr
# (Anzahl Tage / 7 Tage pro Woche)
durchschnitt_pro_woche = passanten_jahr_summe / (anzahl_tage_erfasst / 7),
# 4. Mittelwert pro Tag
# Wir teilen die Jahressumme durch die Anzahl der erfassten Tage
durchschnitt_pro_tag = passanten_jahr_summe / anzahl_tage_erfasst,
# 5. Mittelwert pro Stunde
# Da die Rohdaten bereits stündlich sind, ist dies der
# einfache Mittelwert der 'passanten'-Spalte
durchschnitt_pro_stunde = mean(passanten, na.rm = TRUE)
)
# --- 2. Analyse aggregiert (insgesamt) ---
# (Hier fassen wir alle Messstellen zusammen, indem wir group_by() weglassen)
passanten_insgesamt <- passanten %>%
summarise(
# 1. Jahressumme (Gesamt)
passanten_jahr_summe = sum(passanten, na.rm = TRUE),
# Hilfsberechnung: Anzahl der einzigartigen Tage im gesamten Datensatz
anzahl_tage_erfasst = n_distinct(as.Date(zeitstempel)),
# 2. Mittelwert pro Monat (Gesamt)
durchschnitt_pro_monat = passanten_jahr_summe / 12,
# 3. Mittelwert pro Woche (Gesamt)
durchschnitt_pro_woche = passanten_jahr_summe / (anzahl_tage_erfasst / 7),
# 4. Mittelwert pro Tag (Gesamt)
durchschnitt_pro_tag = passanten_jahr_summe / anzahl_tage_erfasst,
# 5. Mittelwert pro Stunde (Gesamt)
durchschnitt_pro_stunde = mean(passanten, na.rm = TRUE)
)
passanten_pro_location
passanten_insgesamt